/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.sysdrive.DAO;

import br.com.sysdrive.model.Produto;
import br.com.sysdrive.model.Servico;
import br.com.sysdrive.model.Veiculo;
import br.com.sysdrive.model.Venda;
import br.com.sysdrive.model.VendaProduto;
import br.com.sysdrive.model.VendaServico;
import br.com.sysdrive.util.ConnectionFactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Willian Frias
 */
public class VendaDAOImpl {

    private Connection conn;
    private ResultSet rs;

    public VendaDAOImpl() throws Exception {
        try {
            this.conn = ConnectionFactory.getConnection();
            System.out.println("Conectado com Sucesso!");
        } catch (Exception ex) {
            throw new Exception(ex.getMessage());
        }
    }

    public Integer cadastrar(Object object) {
        PreparedStatement stmt = null;
        ResultSet rs = null;
        Integer idVenda = null;
        Venda venda = (Venda) object;
        String sql = "insert into venda (tipo_venda, "
                + "descricao_situacao_venda, "
                + "data_inicio_venda, "
                + "data_final_venda, "
                + "valor_venda, "
                + "periodo_garantia_venda, "
                + "status_venda, "
                + "id_veiculo ) "
                + "values (?,?,?,?,?,?,?,?) returning id_venda;";
        try {
            stmt = conn.prepareStatement(sql);
            stmt.setString(1, venda.getTipoVenda().toUpperCase());
            stmt.setString(2, venda.getDescricaoSituacaoVenda().toUpperCase());
            stmt.setDate(3, new java.sql.Date(venda.getDataInicioVenda().getTime()));
            stmt.setDate(4, new java.sql.Date(venda.getDataFinalVenda().getTime()));
            stmt.setDouble(5, venda.getValorVenda());
            stmt.setString(6, venda.getPeriodoGarantiaVenda().toUpperCase());
            stmt.setString(7, venda.getStatusVenda().toUpperCase());
            stmt.setInt(8, venda.getVeiculo().getIdVeiculo());
            rs = stmt.executeQuery();

            while (rs.next()) {
                idVenda = rs.getInt("id_venda");
            }

        } catch (SQLException ex) {
            System.out.println("Problemas ao cadastrar Venda! Erro VendaDAO:" + ex.getMessage());
            ex.printStackTrace();
            return null;
        } finally {
            try {
                ConnectionFactory.closeConnection(conn, stmt);
            } catch (Exception ex) {
                System.out.println("Problemas ao fechar os parâmetros de conexão! Erro VendaDAO:" + ex.getMessage());
                ex.printStackTrace();
            }
        }
        return idVenda;
    }

    public List<Object> listar() {
        List<Object> resultado = new ArrayList<Object>();
        PreparedStatement stmt = null;
        ResultSet rs = null;
        String sql = "select v.* "
                + "from venda v;";
        try {
            stmt = conn.prepareStatement(sql);
            rs = stmt.executeQuery();

            while (rs.next()) {
                Venda venda = new Venda();
                venda.setIdVenda(rs.getInt("id_venda"));
                venda.setTipoVenda(rs.getString("tipo_venda"));
                venda.setDescricaoSituacaoVenda(rs.getString("descricao_situacao_venda"));
                venda.setDataInicioVenda(rs.getDate("data_inicio_venda"));
                venda.setDataFinalVenda(rs.getDate("data_final_venda"));
                venda.setValorVenda(rs.getDouble("valor_venda"));
                venda.setPeriodoGarantiaVenda(rs.getString("periodo_garantia_venda"));
                venda.setStatusVenda(rs.getString("status_venda"));


                PreparedStatement stmt2 = null;
                ResultSet rs2 = null;

                List<VendaProduto> vendaProdutos = new ArrayList<VendaProduto>();

                String sql2 = "select vp.*, p.* from venda_produto vp, produto p where vp.id_venda = ? and vp.id_produto = p.id_produto;";

                try {
                    stmt2 = conn.prepareStatement(sql2);
                    stmt2.setInt(1, venda.getIdVenda());
                    rs2 = stmt2.executeQuery();

                    while (rs2.next()) {
                        Produto produto = new Produto();
                        produto.setIdProduto(rs2.getInt("id_produto"));
                        produto.setNomeProduto(rs2.getString("nome_produto"));

                        VendaProduto vendaProduto = new VendaProduto();
                        vendaProduto.setQtdVendaProduto(rs2.getDouble("qtd_venda_produto"));
                        vendaProduto.setProduto(produto);
                        vendaProduto.setVenda(venda);
                        vendaProdutos.add(vendaProduto);
                    }
                } catch (SQLException ex) {
                    System.out.println("Problemas ao Listar VendaDAO! Erro: " + ex.getMessage());
                    ex.printStackTrace();
                }

                venda.setVendaProduto(vendaProdutos);

                PreparedStatement stmt3 = null;
                ResultSet rs3 = null;
                List<VendaServico> vendaServicos = new ArrayList<VendaServico>();
                String sql3 = "select vs.*, s.* from venda_servico vs,servico s where vs.id_venda = ? and vs.id_servico = s.id_servico;";
                try {
                    stmt3 = conn.prepareStatement(sql3);
                    stmt3.setInt(1, venda.getIdVenda());
                    rs3 = stmt3.executeQuery();
                    while (rs3.next()) {
                        Servico servico = new Servico();
                        servico.setIdServico(rs3.getInt("id_servico"));
                        servico.setDescricaoServico(rs3.getString("descricao_servico"));

                        VendaServico vendaServico = new VendaServico();
                        vendaServico.setQtdVendaServico(rs3.getDouble("qtd_venda_servico"));
                        vendaServico.setServico(servico);
                        vendaServico.setVenda(venda);
                        vendaServicos.add(vendaServico);
                    }
                } catch (SQLException ex) {
                    System.out.println("Problemas ao Listar VendaDAO! Erro: " + ex.getMessage());
                    ex.printStackTrace();
                }
                venda.setVendaServico(vendaServicos);
                resultado.add(venda);
            }

        } catch (SQLException ex) {
            System.out.println("Problemas ao listar CompraDAO! Erro:" + ex.getMessage());
            ex.printStackTrace();
        } finally {
            try {
                ConnectionFactory.closeConnection(conn, stmt, rs);
            } catch (Exception ex) {
                System.out.println("Problemas ao fechar os parametros de conexao! Erro:" + ex.getMessage());
                ex.printStackTrace();
            }
        }
        return resultado;
    }

    public Object carregar(int idObject) {
        PreparedStatement stmt = null;
        Venda venda = null;
        ResultSet rs = null;
        String sql = "select v.id_venda, v.tipo_venda, v.descricao_situacao_venda, "
                + "v.data_inicio_venda, v.data_final_venda, v.valor_venda, v.periodo_garantia_venda, "
                + "v.status_venda, from venda v where v.id_venda = ?";
        try {
            stmt = conn.prepareStatement(sql);
            stmt.setInt(1, idObject);
            rs = stmt.executeQuery();
            while (rs.next()) {
                venda = new Venda();
                venda.setTipoVenda(rs.getString("tipo_venda"));
                venda.setDescricaoSituacaoVenda(rs.getString("descricao_situacao_venda"));
                venda.setDataInicioVenda(rs.getDate("data_inicio_venda"));
                venda.setDataFinalVenda(rs.getDate("data_final_venda"));
                venda.setValorVenda(rs.getDouble("valor_venda"));
                venda.setPeriodoGarantiaVenda(rs.getString("periodo_garantia_venda"));
                venda.setStatusVenda(rs.getString("status_venda"));
                venda.setIdVenda(rs.getInt("id_venda"));

                Veiculo veiculo = new Veiculo();
                veiculo.setIdVeiculo(rs.getInt("id_veiculo"));

                venda.setVeiculo(veiculo);

            }
            return venda;
        } catch (SQLException ex) {
            System.out.println("Problemas no SQL ao Carregar Venda! Erro VendaDAO: " + ex.getMessage());
            ex.printStackTrace();
            return null;
        } finally {
            try {
                ConnectionFactory.closeConnection(conn, stmt, rs);
            } catch (Exception ex) {
                System.out.println("Problemas ao fechar os parâmetros de conexão Carregar Venda! Erro VendaDAO: " + ex.getMessage());
                ex.printStackTrace();
            }
        }
    }

    public Boolean alterar(Object object) {
        PreparedStatement stmt = null;
        Venda venda = (Venda) object;
        String sql = "update venda set tipo_venda = ?, "
                + "descricao_situacao_venda = ?, "
                + "data_inicio_venda = ?, "
                + "data_final_venda = ?, "
                + "valor_venda = ?, "
                + "periodo_garantia_venda = ?, "
                + " status_venda = ?, "
                + "id_veiculo = ? "
                + "where id_venda = ?";
        try {
            stmt = conn.prepareStatement(sql);
            stmt.setString(1, venda.getTipoVenda().toUpperCase());
            stmt.setString(2, venda.getDescricaoSituacaoVenda().toUpperCase());
            stmt.setDate(3, new java.sql.Date(venda.getDataInicioVenda().getTime()));
            stmt.setDate(4, new java.sql.Date(venda.getDataFinalVenda().getTime()));
            stmt.setDouble(5, venda.getValorVenda());
            stmt.setString(6, venda.getPeriodoGarantiaVenda().toUpperCase());
            stmt.setString(7, venda.getStatusVenda().toUpperCase());
            stmt.setInt(8, venda.getVeiculo().getIdVeiculo());
            stmt.setInt(9, venda.getIdVenda());
            stmt.executeUpdate();
            return true;
        } catch (SQLException ex) {
            System.out.println("Problemas no SQL ao alterar Venda! Erro VendaDAO: " + ex.getMessage());
            return false;
        } finally {
            try {
                ConnectionFactory.closeConnection(conn, stmt);
            } catch (Exception ex) {
                System.out.println("Problemas ao fechar parâmetros de conexão Alterar Venda! Erro VendaDAO: " + ex.getMessage());
            }
        }
    }
}
